<?php
/* © 2020-2025 ALYR.NET */
/**
 * 会话检查和用户认证
 * 用于保护需要登录才能访问的页面
 */

// 启动会话
if (session_status() == PHP_SESSION_NONE) {
    session_start();
}

// 引入钉钉配置文件
if (file_exists(__DIR__ . '/config/dingtalk.php')) {
    require_once __DIR__ . '/config/dingtalk.php';
}

/**
 * 检查用户是否已登录
 * @return bool 是否已登录
 */
function is_user_logged_in() {
    return isset($_SESSION['user_logged_in']) && 
           $_SESSION['user_logged_in'] === true && 
           isset($_SESSION['dd_user_id']) && 
           !empty($_SESSION['dd_user_id']);
}

/**
 * 检查会话是否过期
 * @return bool 是否过期
 */
function is_session_expired() {
    if (!isset($_SESSION['login_time'])) {
        return true;
    }
    
    $sessionLifetime = get_dingtalk_config('login.sessionLifetime', 12 * 3600);
    return (time() - $_SESSION['login_time']) > $sessionLifetime;
}

/**
 * 获取当前登录用户信息
 * @return array|null 用户信息数组或null
 */
function get_logged_in_user() {
    if (!is_user_logged_in()) {
        return null;
    }
    
    return [
        'user_id' => $_SESSION['dd_user_id'],
        'user_name' => $_SESSION['dd_user_name'] ?? '用户',
        'user_avatar' => $_SESSION['dd_user_avatar'] ?? '',
        'login_time' => $_SESSION['login_time'] ?? time()
    ];
}

/**
 * 要求用户登录（如果未登录则重定向到登录页）
 * @param string $redirect_after_login 登录后重定向的页面
 */
function require_login($redirect_after_login = null) {
    if (!is_user_logged_in() || is_session_expired()) {
        // 记录当前页面，登录后重定向回来
        if ($redirect_after_login) {
            $_SESSION['login_redirect'] = $redirect_after_login;
        } else {
            $_SESSION['login_redirect'] = $_SERVER['REQUEST_URI'] ?? 'index.php';
        }
        
        // 检查是否曾经登录过（通过检查是否有用户ID但会话过期）
        $wasLoggedIn = isset($_SESSION['dd_user_id']) && !empty($_SESSION['dd_user_id']);
        
        // 如果会话过期且曾经登录过，显示过期消息
        if (is_session_expired() && $wasLoggedIn) {
            session_destroy();
            header('Location: login.php?error=session_expired');
        } else {
            // 首次访问或从未登录过，不显示过期消息
            header('Location: login.php');
        }
        exit;
    }
}

/**
 * 更新会话时间（用于保持会话活跃）
 */
function refresh_session() {
    if (is_user_logged_in()) {
        $_SESSION['login_time'] = time();
    }
}

/**
 * 检查是否为AJAX请求
 * @return bool
 */
function is_ajax_request() {
    return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && 
           strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest';
}

/**
 * 为AJAX请求返回JSON格式的认证错误
 */
function ajax_auth_error($message = '请先登录') {
    header('Content-Type: application/json');
    http_response_code(401);
    echo json_encode([
        'success' => false,
        'error' => $message,
        'redirect' => 'login.php'
    ]);
    exit;
}

/**
 * 智能认证检查（支持普通页面和AJAX请求）
 */
function smart_auth_check() {
    if (!is_user_logged_in() || is_session_expired()) {
        if (is_ajax_request()) {
            // 检查是否曾经登录过
            $wasLoggedIn = isset($_SESSION['dd_user_id']) && !empty($_SESSION['dd_user_id']);
            $message = (is_session_expired() && $wasLoggedIn) ? '会话已过期，请重新登录' : '请先登录';
            ajax_auth_error($message);
        } else {
            require_login();
        }
    } else {
        // 刷新会话时间
        refresh_session();
    }
}